package com.jtny.nytb.equipment.service;

import com.jtny.nytb.equipment.vo.dataparam.AlgorithmExcelVO;
import com.jtny.nytb.equipment.vo.excel.*;
import com.jtny.nytb.equipment.vo.typeAndArea.DeviceAreaResponseVO;
import com.jtny.nytb.equipment.dto.dataparam.AlarmTempDTO;
import com.jtny.nytb.equipment.dto.dataparam.AlgorithmTempDTO;
import com.jtny.nytb.equipment.dto.dataparam.DataParamTempDTO;
import com.jtny.nytb.equipment.dto.dataparam.LabelTempDTO;
import com.jtny.nytb.equipment.dto.device.DataParamCoreDTO;
import com.jtny.nytb.equipment.dto.excel.*;
import com.jtny.nytb.equipment.dto.model.ExcelModelDTO;
import com.jtny.nytb.equipment.dto.model.ModelInfoDTO;
import com.jtny.nytb.equipment.dto.rule.CodeRuleDictDTO;
import com.jtny.nytb.equipment.enums.DataParamImportEnum;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author 智慧能源中心 - 伍天宇
 * @package com.jtny.nytb.equipment.biz
 * @fileName RedisBiz.java
 * @createTime 2023年10月11日 13:37
 * @Copyright© 2023 jtny
 * 江投能源技术研究院 版权所有
 */
public interface RedisService {

    /**
     * 按名称获取字典规则
     * 获取规则字典
     *
     * @param type 类型
     * @param name 名字
     * @return {@link CodeRuleDictDTO}
     */
    CodeRuleDictDTO getDictRuleByName(String type, String name);

    /**
     * 按名称获取设备模型响应
     *
     * @param name 名字
     * @return {@link DeviceAreaResponseVO}
     */
    DataParamTempDTO getDataParamTempDTOByName(String name);







    void setDataParamBasePref(List<ExcelDataParamVO> dataParamExcelList, DataParamImportEnum typeEnum);

    void setFrequencyExcel(List<ExcelFrequencyVO> frequencyExcelList);

    void setAlgorithmExcel(List<AlgorithmExcelVO> algorithmExcelList);

    void setAlgorithmParamExcel(List<ExcelAlgorithmParamVO> algorithmParamExcelList);



    void setAlarmExcel(List<ExcelAlarmVO> alarmExcelList);

    /**
     * 获取设备参量关系
     *
     * @param equipmentId 设备ID
     * @return
     */
    DataParamCoreDTO getEquipmentDataParamRelation(Long equipmentId);


    /**
     * 删除 Redis 全部清理
     */
    void deleteRedisCleanAll();

    /**
     * 获取 报警点分类 字典
     *
     * @return
     */
    Map<String, String> getDictAlarmType();

    /**
     * 获取 报警等级 字典
     *
     * @return
     */
    Map<String, String> getDictAlarmLevel();

    /**
     * 按名称设置所有规则字典
     * 按名称 临时设置所有规则字典
     *
     * @param dictNameList dict 名称列表
     * @param type         类型
     */
    void setAllRuleDictByName(DataParamImportEnum type, List<String>... dictNameList);

    /**
     * 构建规则
     * 构建导入设备的编号生成规则
     *
     * @param enumType      枚举类型
     * @param vo            VO
     * @param dto           DTO
     * @param logRecordName 日志记录名称
     * @return {@link ExcelResultVO}
     */
    Boolean buildRule(DataParamImportEnum enumType, ExcelNormalCodeRuleVO vo, ExcelNormalCodeRuleDTO dto, String logRecordName);


    /**
     * 设置所有 Excel 模型
     *
     * @param excelEquipmentDTOS Excel设备DTOS
     */
    void setAllExcelModel(List<ExcelModelDTO> excelEquipmentDTOS);

    List<ExcelModelDTO> listAllExcelModel();

    ExcelModelDTO getExcelModelDTOByName(String name);

    void setExcelModel(ExcelModelDTO excelModel);

    /**
     * 设置所有Excel设备基础
     *
     * @param equipmentExcelDTOList 设备 excel dtolist
     */
    void setAllExcelEquipmentBase(List<ExcelEquipmentDTO> equipmentExcelDTOList);

    /**
     * 获取所有要导入的设备
     *
     * @return {@link List}<{@link ExcelEquipmentDTO}>
     */
    List<ExcelEquipmentDTO> listAllExcelEquipmentBase();

    /**
     * 设置 Excel 设备
     *
     * @param equipmentExcel 设备excel
     */
    void setExcelEquipment(ExcelEquipmentDTO equipmentExcel);

    /**
     * 获取Excel设备DTOBY名称
     *
     * @param name 名字
     * @return {@link ExcelEquipmentDTO}
     */
    ExcelEquipmentDTO getExcelEquipmentDTOByName(String name);

    ExcelInstrumentDTO getExcelInstrumentDTOByName(String name);



    /**
     * 按路径获取标签
     *
     * @param name 路径
     * @return {@link ExcelEquipmentLabelDTO}
     */
    List<ExcelEquipmentLabelDTO> getRedisKey4LabelList(String name);

    /**
     * 设置 Redis key4 参数
     *
     * @param key            钥匙
     * @param excelParamDTOS Excel 参数 DTOS
     */
    void setRedisKey4ParamList(String key, List<ExcelParamDTO> excelParamDTOS);

    List<ExcelParamDTO> getRedisKey4ParamList(String key);

    /**
     * 按设备名称设置所有型号setAllModelByEquipmentName
     *
     * @param mapEquipmentModel 设备型号图
     * @param mapEquipmentModel 地图设备型号
     */
    void setAllModelByEquipmentName(Map<String, String> mapEquipmentModel, Map<String, ModelInfoDTO> mapModel);

    /**
     * 按模型名称获取模型信息
     *
     * @param modelName 型号名称
     * @return {@link ModelInfoDTO}
     */
    ModelInfoDTO getModelInfoByModelName(String modelName);

    /**
     * 地图设备名称型号名称
     *
     * @param equipmentNameList 设备名称列表
     * @return {@link Map}<{@link String}, {@link String}>
     */
    Map<String, String> mapEquipmentNameModelName(Collection<String> equipmentNameList);

    /**
     * 按模型名称映射数据参数 temp
     *
     * @param modelNameList 型号名称
     * @return {@link Map}<{@link String}, {@link List}<{@link DataParamTempDTO}>>
     */
    Map<String, List<DataParamTempDTO>> mapDataParamTempByModelNameList(List<String> modelNameList);
//
//    /**
//     * 按设备名称获取型号信息
//     *
//     * @param equipmentName 设备名称
//     * @return {@link ModelInfoDTO}
//     */
//    ModelInfoDTO getModelInfoByEquipmentName(String equipmentName);

    /**
     * 按设备名称列出数据参数 temp
     *
     * @param equipmentName 设备名称
     * @return {@link List}<{@link DataParamTempDTO}>
     */
    List<DataParamTempDTO> listDataParamTempByEquipmentName(String equipmentName);

    /**
     * 按参量名获取数据参数
     * @param paramNameList
     * @return
     */
    List<DataParamTempDTO> listDataParamTempByParamName(List<String> paramNameList );


    /**
     * 按算法名获取数据参数
     * @param paramName
     * @return
     */
    Map<String, AlgorithmTempDTO> listAlgorithmTempByParamName(List<String> paramName );

    /**
     * 按标签名获取数据参数
     * @param paramNameList
     * @return
     */
    List<LabelTempDTO> listLabelTempByParamName(List<String> paramNameList );

    /**
     * 按报警名获取数据参数
     * @param paramName
     * @return
     */
    Map<String,List<AlarmTempDTO>> listAlarmTempByParamName(List<String> paramName );

    /**
     * 设置 本次 导入Excel 结果
     */
    void setExcelResult(ExcelResultVO result);

    /**
     * 获取 本次 导入Excel 结果
     *
     * @return {@link ExcelResultVO}
     */
    ExcelResultVO getExcelResult(Long userId);

    /**
     * 设置所有 Excel 仪器
     *
     * @param instrumentList 仪器清单
     */
    void setAllExcelInstrument(List<ExcelInstrumentDTO> instrumentList);

    /**
     * 设置仪器 Excel
     *
     * @param excelInstrument Excel 仪器
     */
    void setInstrumentExcel(ExcelInstrumentDTO excelInstrument);

    /**
     * 列出所有 Excel 仪器
     *
     * @return {@link List}<{@link ExcelInstrumentDTO}>
     */
    List<ExcelInstrumentDTO> listAllExcelInstrument();

    /**
     * SET Redis KEY4 仪器市场调查数据一览
     *
     * @param instrumentName       仪器名称
     * @param instrumentReportList 仪器 市场调查报告一览
     */
    void setRedisKey4InstrumentReportList(String instrumentName, List<ExcelInstrumentReportDTO> instrumentReportList);
}
